#include<iostream>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<sys/types.h>

using namespace std;

void do_work()
{
    int count=3;
    while(count)
    {
        printf("我是子进程,mypid=%d myppid=%d count=%d\n",getpid(),getppid(),count--);
        sleep(1);
    }
}

int main()//非阻塞等待
{
    pid_t i=fork();//为父进程返回子进程的id，为子进程返回0
    if(i==0)
    {
         //子进程
         do_work();
         exit(0);
    }
    while(1)//轮询等待
    {

        //父进程
        pid_t ret = waitpid(i,NULL,WNOHANG);//等待成功返回所等待进程的id
        if(ret==0)
        {
            cout<<"等待中"<<endl;
        }
        else if(ret==i)
        {
            cout<<"等待成功，所等待进程的id:"<<ret<<endl;
            break;
        }
        else
        {
            cout<<"等待失败"<<endl;
            break;
        }
        sleep(1);
    }

    return 0;
}

//int main()//多进程等待
//{
//    int i=0;
//    for(i=0;i<10;i++)
//    {
//        pid_t id=fork();
//        if(id==0)//子进程进入
//        {
//            do_work();
//            exit(1);
//        }
//    }
//
//    for(i=0;i<10;i++)
//    {
//        pid_t ret = waitpid(-1,NULL,0);//等待任意一个子进程等价于wait
//        if(ret>0)
//            printf("进程等待成功，pid:%d\n",ret);
//    }
//
//    return 0;
//}

#if 0//进程等待waitpid函数的第二个参数
int main()
{
    pid_t i=fork();
    if(i==0)//子进程
    {
        do_work();
        exit(10);
    }
    else//父进程
    {
        cout<<"等待之前"<<endl;
        int sta=0;
        pid_t ret=waitpid(-1,&sta,0);
        cout<<"等待之后"<<endl;
        
        if(ret==i)//父进程会返回子进程的id
        {
            printf("子进程正常退出，pid:%d ,ret:%d ,exit code:%d ,exit sigal:%d \n",getpid(),ret,(sta>>8)&0xFF,sta&0x7F);
        }
    }

    return 0;
}
#endif
